/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.afcepf.projet2.metiers.donnees.entites.commandes;

import fr.afcepf.projet2.metiers.donnees.entites.comptes.Adresse;
import fr.afcepf.projet2.metiers.donnees.entites.comptes.Utilisateur;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;

/**
 *
 * @author sylva_000
 */
@Entity(name = "Commande")
@NamedQueries({
    @NamedQuery(name = "Commande.findByUtilisateur",
        query = "SELECT c FROM Commande c "
        + "WHERE c.utilisateur = :utilisateur"),
    @NamedQuery(name = "Commande.findByEtatCommande",
        query = "SELECT c FROM Commande c "
        + "WHERE c.etatCommande = :etatCommande AND c.site = :site"),
    @NamedQuery(name = "Commande.findByNumeroCommande",
        query = "SELECT c FROM Commande c"
        + " WHERE c.numeroCommande = :numeroCommande")})
public class Commande implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "idCommande")
    private Long idCommande;
    @Column(name = "Site")
    private String site;
    @Column(name = "NumeroCommande")
    private String numeroCommande;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "DateCommande")
    private Date dateCommande;
    @ManyToOne
    @JoinColumn(name = "ModeLivraison")
    private ModeLivraison modeLivraison;
    @ManyToOne
    @JoinColumn(name = "EtatCommande")
    private EtatCommande etatCommande;
    @ManyToOne
    @JoinColumn(name = "ModePaiement")
    private ModePaiement modePaiement;
    @OneToMany(fetch = FetchType.LAZY,
    orphanRemoval = true,
    cascade = {CascadeType.DETACH,
        CascadeType.MERGE, CascadeType.PERSIST,
        CascadeType.REFRESH})
    @JoinTable(name = "Commande_Ligne",
    joinColumns =
    @JoinColumn(name = "idCommande"),
    inverseJoinColumns =
    @JoinColumn(name = "idLigneCommande"))
    private List<LigneCommande> ligneCommandes;
    @ManyToOne()
    @JoinColumn(name = "AdresseLivraison")
    private Adresse adresseLivraison;
    @ManyToOne()
    @JoinColumn(name = "AdresseFacturation")
    private Adresse adresseFacturation;
    @ManyToOne()
    @JoinColumn(name = "Utilisateur")
    private Utilisateur utilisateur;

    public Date getDateCommande() {
        return dateCommande;
    }

    public ModeLivraison getModeLivraison() {
        return modeLivraison;
    }

    public EtatCommande getEtatCommande() {
        return etatCommande;
    }

    public ModePaiement getModePaiement() {
        return modePaiement;
    }

    public void setIdCommande(Long idCommande) {
        this.idCommande = idCommande;
    }

    public void setDateCommande(Date dateCommande) {
        this.dateCommande = dateCommande;
    }

    public void setModeLivraison(ModeLivraison modeLivraison) {
        this.modeLivraison = modeLivraison;
    }

    public void setEtatCommande(EtatCommande etatCommande) {
        this.etatCommande = etatCommande;
    }

    public void setModePaiement(ModePaiement modePaiement) {
        this.modePaiement = modePaiement;
    }

    public String getNumeroCommande() {
        return numeroCommande;
    }

    public void setNumeroCommande(String numeroCommande) {
        this.numeroCommande = numeroCommande;
    }

    public List<LigneCommande> getLigneCommandes() {
        return ligneCommandes;
    }

    public void setLignesCommande(List<LigneCommande> ligneCommandes) {
        this.ligneCommandes = ligneCommandes;
    }

    /**
     * Obitent l'identifiant du site demandeur
     * @return nom du site
     */
    public String getSite() {
        return site;
    }

    /**
     * Défini le site demandeur
     * @param site nom du site
     */
    public void setSite(String site) {
        this.site = site;
    }

    public Adresse getAdresseLivraison() {
        return adresseLivraison;
    }

    public void setAdresseLivraison(Adresse adresseLivraison) {
        this.adresseLivraison = adresseLivraison;
    }

    public Adresse getAdresseFacturation() {
        return adresseFacturation;
    }

    public void setAdresseFacturation(Adresse adresseFacturation) {
        this.adresseFacturation = adresseFacturation;
    }

    public Utilisateur getUtilisateur() {
        return utilisateur;
    }

    public void setUtilisateur(Utilisateur utilisateur) {
        this.utilisateur = utilisateur;
    }

    public Long getIdCommande() {
        return idCommande;
    }
//
//    public void setLigneCommandes(Set<LigneCommande> ligneCommandes) {
//        this.ligneCommandes = ligneCommandes;
//    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idCommande != null ? idCommande.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Commande)) {
            return false;
        }
        Commande other = (Commande) object;
        if ((this.idCommande == null && other.idCommande != null) || (this.idCommande != null && !this.idCommande.equals(other.idCommande))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.afcepf.projet2.entities.commandes.Commande[ id=" + idCommande + " ]";
    }

    /**
     * Permet d'ajouter un ligne de commande à la commande en cours Exemple
     * Commande commande = em.find(Commande.class, 1); LigneCommande ligne =
     * em.find(LigneCommande.class, 1); commande.addLigneCommande(ligne);
     *
     * @param ligneCommande ligne de commande a ajouter
     */
    public void addLigneCommande(LigneCommande ligneCommande) {
        if (!getLigneCommandes().contains(ligneCommande)) {
            getLigneCommandes().add(ligneCommande);
        }
    }
}
